perm filename APPL[EKL,SYS]2 blob sn#818983 filedate 1986-06-13 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	representations of functions: two approaches
C00003 00003	first approach: functions as association lists
C00006 00004	facts about alists
C00009 00005	second approach: functions as lists of numbers
C00011 00006	* alist induction
C00013 00007	proof of facts about alists
C00016 00008	samemap
C00017 00009	apparently stronger definition of samemap
C00023 00010	extensionality
C00027 ENDMK
C⊗;
;representations of functions: two approaches
(wipe-out)
(get-proofs nth)
;first approach: functions as association lists

(proof appalist)

(decl dom (type: |GROUND→GROUND|))
(defax dom |∀xa y alist.dom nil=nil∧
                        dom((xa.y).alist)=xa.dom alist| )
(label domdef)

(decl range (type: |GROUND→GROUND|))
(defax range |∀xa y alist.range nil=nil∧
                          range((xa.y).alist)=y.range alist| )
(label rangedef)

(decl functp (type: |GROUND→TRUTHVAL|))
(define functp |∀alist.functp(alist)≡uniqueness dom(alist)|)
(label functdef)

(decl injectp (type: |GROUND→TRUTHVAL|))
(define injectp |∀alist.injectp(alist)≡functp(alist)∧uniqueness range(alist)|)
(label injectdef)

(decl (appalist) (type: |ground⊗ground→ground|))
(define appalist |∀alist y.appalist(y,alist)=cdr assoc(y,alist)|)
(label appalistdef)

(decl (samemap) (type: |ground⊗ground→truthval|))
(define samemap 
 |∀alist alist1.samemap(alist,alist1)≡
                mklset dom(alist)=mklset dom(alist1)∧
                (∀y.yεmklset dom(alist)⊃appalist(y,alist)=appalist(y,alist1))|)
(label samemapdef)

(define permutp |∀alist.permutp(alist)≡
                        functp(alist)∧mklset(dom(alist))=mklset(range(alist))|)
(label permutp_def)

(axiom |∀chi.chi(nil)∧(∀xa y alist.chi(alist)⊃chi((xa.y).alist))⊃(∀alist.chi(alist))|)
(label alistinduction)

;facts about alists

(proof alistfacts)

(axiom |∀alist.listp(dom alist)|)
(label domsort)(label simpinfo)

(axiom |∀alist.listp(range alist)|)
(label rangesort)(label simpinfo)

(axiom |∀alist.length (dom(alist))=length alist|)
(label domlength)

(axiom |∀alist.length(dom(alist))=length(range(alist))|)
(label domrangelength)

(axiom |∀alist y.sexp appalist(y,alist)|)
(label appalistsort)(label simpinfo)

(axiom |∀alist y.¬yεmklset(dom(alist))⊃appalist(y,alist)=nil|)
(label trivial_appalist)

;Exercise:
;∀alist z.member(z,range alist)⊃(∃x.member(x.z,alist))
;(label member_range)

;∀alist x z.member(x.z,alist)⊃member(z,range(alist))
;(label membership_alist_range)

;∀alist x z.x=appalist(z,alist)∧atom assoc(z,alist)⊃null x
;(label trivial_assoc)

(axiom |∀alist.samemap(alist,alist)|)
(label samemap_equivalence)

(axiom |∀alist alist1.samemap(alist,alist1)⊃samemap(alist1,alist)|)
(label samemap_equivalence)

(axiom 
   |∀alist alist1 alist2.
       samemap(alist,alist1)∧samemap(alist1,alist2)⊃samemap(alist,alist2)|)
(label samemap_equivalence)

(axiom |∀alist1 alist2.samemap(alist1,alist2)≡
                       (mklset(dom(alist1))=mklset(dom(alist2))∧
                       (∀x.appalist(x,alist1)=appalist(x,alist2)))|)
(label samemap_def1)
;second approach: functions as lists of numbers

(proof appl)

(define appl |∀u i.appl(u,i)=nth(u,i)|)
(label appldef)

;extensionality for functions 

(axiom |∀u v.length u=length v∧(∀i.i<length u⊃appl(u,i)=appl(v,i))⊃u=v|)
(label extensionality)
 
(axiom |∀u i.i<length u ⊃ sexp(appl(u,i))∧member(appl(u,i),u)|)
(label applfacts) (label simpinfo)

;predicates for functions 

(decl (into) (type: |ground→truthval|))
(define into |∀u.into(u)=(∀n.n<length u⊃natnum nth(u,n)∧nth(u,n)<length u)|)
(label intodef)

(decl (onto) (type: |ground→truthval|))
(define onto |∀u.onto(u)=(into(u)∧(∀n.n<length u⊃member(n,u)))|)
(label ontodef)
 
(decl (perm) (type: |ground→truthval|))
(define perm |∀u.perm(u)=onto(u)|)

;injectivity is given by the predicate inj

(save-proofs appl)
;* alist induction

(wipe-out)
(get-proofs appal)
(proof alistind)

(assume |chi nil|)
(label alind0)

(assume |∀xa y alist.chi(alist)⊃chi((xa.y).alist)|)
(label alind1)

(assume |alistp u⊃chi u|)
(label alind2)

(assume |alistp (x.u)|)
(label alind3)

(ue (alist |x.u|) alistdef *)
;¬ATOM X∧ATOM CAR X∧ALISTP U

(ue ((xa.|car x|)(y.|cdr(x)|)(alist.u)) alind1 * alind3 alind2)
;CHI(X.U)
;deps: (ALIND1 ALIND2 ALIND3)

(ci alind3)
;ALISTP X.U⊃CHI(X.U)
;deps: (ALIND1 ALIND2)

(ci alind2)
;(ALISTP U⊃CHI(U))⊃(ALISTP X.U⊃CHI(X.U))
;deps: (ALIND1)

(ue (phi |λu.alistp(u)⊃chi(u)|) listinduction * alind0 alind1)
;∀U.ALISTP U⊃CHI(U)

(derive |∀alist.chi alist| *)
;deps: (ALIND0 ALIND1)

(ci (alind0 alind1))
;CHI(NIL)∧(∀XA Y ALIST.CHI(ALIST)⊃CHI((XA.Y).ALIST))⊃(∀ALIST.CHI(ALIST))
;proof of facts about alists

(wipe-out)
(get-proofs appal)
(proof alistproofs)

(unlabel simpinfo domsort rangesort appalistsort)
;domsort

(ue (chi |λalist.listp dom(alist)|) alistinduction (open dom))
;∀ALIST.LISTP DOM(ALIST)
(label simpinfo domsort)

;rangesort

(ue (chi |λalist.listp range(alist)|) alistinduction (open range))
;∀ALIST.LISTP RANGE(ALIST)
(label simpinfo rangesort)

;domlength

(ue (chi |λalist.length dom alist=length alist|) alistinduction (open dom))
;∀ALIST.LENGTH (DOM(ALIST))=LENGTH ALIST

;domrangelength 

(ue (chi |λalist.length(dom alist)=length(range alist)|) alistinduction 
    (open dom range))
;∀ALIST.LENGTH (DOM(ALIST))=LENGTH (RANGE(ALIST))

;appalistsort

(ue (chi |λalist.sexp appalist(y,alist)|) alistinduction 
    (part 1(open appalist assoc)))
;∀ALIST.SEXP APPALIST(Y,ALIST)
(label simpinfo appalistsort)

;trivial appalist

(ue (chi |λalist.¬(yεmklset dom(alist))⊃appalist(y,alist)=nil|) alistinduction
    (part 1 (open epsilon mklset dom appalist assoc member)))
;∀ALIST.¬YεMKLSET(DOM(ALIST))⊃APPALIST(Y,ALIST)=NIL

;member range

(ue (chi |λalist.member(z,range alist)⊃(∃x.member(x.z,alist))|)
    alistinduction 
    (open range member)(use normal mode: always))
;∀ALIST.MEMBER(Z,RANGE(ALIST))⊃(∃X.MEMBER(X.Z,ALIST))

;membership alist range

(trw |∀x y.x=y⊃cdr x=cdr y|)
;∀X Y.X=Y⊃CDR X=CDR Y

(ue ((x.|x.z|)(y.|xa.y|)) *)
;X.Z=XA.Y⊃Z=Y

(ue (chi |λalist.member(x.z,alist)⊃member(z,range alist)|)
    alistinduction
    (open appalist assoc range member)
    (use demorgan1 * normal mode: always))
;∀ALIST.MEMBER(X.Z,ALIST)⊃MEMBER(Z,RANGE(ALIST))

;trivial assoc

;(ue (chi |λalist.x=cdr assoc(z,alist)∧atom assoc(z,alist)⊃null x|) alistinduction
;    (open assoc))
;∀ALIST.X=CDR ASSOC(Z,ALIST)∧ATOM ASSOC(Z,ALIST)⊃NULL X
;samemap

(trw |samemap(alist,alist)|(open samemap))
;SAMEMAP(ALIST,ALIST)

(trw |samemap(alist,alist1)⊃samemap(alist1,alist)| (open samemap mklset dom))
;SAMEMAP(ALIST,ALIST1)⊃SAMEMAP(ALIST1,ALIST)

(trw |samemap(alist,alist1)∧samemap(alist1,alist2)⊃samemap(alist,alist2)|
    (open samemap mklset dom))
;SAMEMAP(ALIST,ALIST1)∧SAMEMAP(ALIST1,ALIST2)⊃SAMEMAP(ALIST,ALIST2)

;apparently stronger definition of samemap

(wipe-out)
(get-proofs appl)
(proof samemap)

(assume |samemap(alist1,alist2)|)

(rw * (open samemap))
;MKLSET(DOM(ALIST1))=MKLSET(DOM(ALIST2))∧
;(∀Y.YεMKLSET(DOM(ALIST1))⊃APPALIST(Y,ALIST1)=APPALIST(Y,ALIST2))

(trw |¬yεmklset(dom(alist1))⊃appalist(y,alist1)=appalist(y,alist2)|
     (use trivial_appalist mode: always) 
     (use * mode: exact))
;¬YεMKLSET(DOM(ALIST1))⊃APPALIST(Y,ALIST1)=APPALIST(Y,ALIST2)

(ue ((q.|yεmklset dom(alist1)|)(p.|appalist(y,alist1)=appalist(y,alist2)|))
    excluded_middle * -2)
;APPALIST(Y,ALIST1)=APPALIST(Y,ALIST2)

(derive |mklset(dom(alist1))=mklset(dom(alist2))∧
         ∀y.appalist(y,alist1)=appalist(y,alist2)| (-3 *))

(ci -5)
;SAMEMAP(ALIST1,ALIST2)⊃
;MKLSET(DOM(ALIST1))=MKLSET(DOM(ALIST2))∧
;(∀Y.APPALIST(Y,ALIST1)=APPALIST(Y,ALIST2))

(derive |samemap(alist1,alist2)≡
	(mklset(dom(alist1))=mklset(dom(alist2))∧
	(∀x.appalist(x,alist1)=appalist(x,alist2)))| *)

;extensionality
(wipe-out)
(get-proofs appl)

(proof extensionality)

(assume |length u=length v|)
(label ext1)

(assume |N<LENGTH U|)
(label ext2)

(assume |(∀I.I<LENGTH (NTHCDR(U,N'))⊃NTH(NTHCDR(U,N'),I)=NTH(NTHCDR(V,N'),I))⊃
         NTHCDR(U,N')=NTHCDR(V,N')|) (label ext_indhyp)

(assume |(∀I.I<LENGTH (NTHCDR(U,N'))'⊃
          NTH(NTH(U,N).NTHCDR(U,N'),I)=NTH(NTHCDR(V,N),I))|)(label ext3)

(rw ext2 (use ext1 mode: exact))
;N<LENGTH V
(label ext4)

(rw ext3 (use ext4 mode: exact)
    (use nthcdr_car_cdr ue: ((u.v)(n.n)) ext4 mode: exact))
(label ext5)
;∀I.I<LENGTH (NTHCDR(U,N'))'⊃
;   NTH(NTH(U,N).NTHCDR(U,N'),I)=NTH(NTH(V,N).NTHCDR(V,N'),I)


(ue (i |0|) * (open nth))
;NTH(U,N)=NTH(V,N)
(label ext6)

(ue (i |i'|) ext5 (open nth))
;I<LENGTH (NTHCDR(U,N'))⊃NTH(NTHCDR(U,N'),I)=NTH(NTHCDR(V,N'),I)

(derive |nthcdr(u,n')=nthcdr(v,n')| (ext_indhyp *))
 
(trw |nth(u,n).nthcdr(u,n')=nthcdr(v,n)| 
 (use nthcdr_car_cdr ue: ((u.v)(n.n)) ext4 mode: exact) (use ext6 * mode: exact))
;NTH(U,N).NTHCDR(U,N')=NTHCDR(V,N)
;deps: (EXT1 EXT2 EXT_INDHYP EXT3)

(ci ext3)
;(∀I.I<LENGTH (NTHCDR(U,N'))'⊃NTH(NTH(U,N).NTHCDR(U,N'),I)=NTH(NTHCDR(V,N),I))⊃
;NTH(U,N).NTHCDR(U,N')=NTHCDR(V,N)

(ci ext_indhyp)

(ci ext2)
;N<LENGTH U⊃
;(((∀I.I<LENGTH (NTHCDR(U,N'))⊃NTH(NTHCDR(U,N'),I)=NTH(NTHCDR(V,N'),I))⊃
;  NTHCDR(U,N')=NTHCDR(V,N'))⊃
; ((∀I.I<LENGTH (NTHCDR(U,N'))'⊃
;      NTH(NTH(U,N).NTHCDR(U,N'),I)=NTH(NTHCDR(V,N),I))⊃
;  NTH(U,N).NTHCDR(U,N')=NTHCDR(V,N)))
;deps: (EXT1)

(trw |nthcdr(v,length u)| (use ext1 last_nthcdr mode: exact))
;NTHCDR(V,LENGTH U)=NIL

(ue  ((phi4.|λu n.(∀i.i<length u⊃appl(u,i)=appl(nthcdr(v,n),i))⊃u=nthcdr(v,n)|)
      (u.u)) nthcdr_induction1 (open appl) * -2)
;(∀I.I<LENGTH U⊃NTH(U,I)=NTH(V,I))⊃U=V

(ci ext1)
;LENGTH U=LENGTH V⊃((∀I.I<LENGTH U⊃NTH(U,I)=NTH(V,I))⊃U=V)

(derive |∀u v.length u=length v∧(∀i.i<length u⊃appl(u,i)=appl(v,i))⊃u=v| *)

;applfact has been proved already for nth

(trw |∀u i.i<length u ⊃ sexp(appl(u,i))∧member(appl(u,i),u)| (open appl) nthmember)
;∀U I.I<LENGTH U⊃SEXP APPL(U,I)∧MEMBER(APPL(U,I),U)